home *** CD-ROM | disk | FTP | other *** search
/ Windows News 2010 Summer - Disc 1 / WN_Ete2010_CD1.iso / Onglet5 / Weezo / Weezo setup.exe / {code_appDir} / www / js / rsa-src.js < prev    next >
Text File  |  2010-05-19  |  5KB  |  170 lines

  1. /*
  2.  
  3.  My javascript implementation of the RSA algorithm, ported (partially)
  4.  from the PHP implementation found at http://www.edsko.net/. Using the
  5.  Big Integers library from http://www.ohdave.com/rsa/ (see BigInt.js
  6.  for details).
  7.  
  8.  Send any question, suggestion or remark to: jay.bertrand@free.fr
  9.  
  10.   ----------------------------------------------------------------------------
  11.  
  12.  This software is provided as-is, without express or implied warranty.  
  13.  Permission to use, copy, modify, distribute or sell this software, with or
  14.  without fee, for any purpose and by any individual or organization, is hereby
  15.  granted, provided that the above copyright notice and this paragraph appear 
  16.  in all copies. Distribution as a part of an application or binary must
  17.  include the above copyright notice in the documentation and/or other materials
  18.  provided with the application or distribution.
  19.  
  20.   ----------------------------------------------------------------------------
  21.  
  22.  Exemple of usage:
  23.  
  24.   // first set up the bigint library
  25.   // 76 is a good value for a 512 bits key
  26.   // (use 19 digits per 128 bits)
  27.   setMaxDigits(76);
  28.  
  29.   // prepare modulus and public exponent in hexa string format
  30.   // (i.e. each byte represented as hexa decimal digit)
  31.   var modulus = "0099d74e67d039f75654aea8d19fb199...16d";
  32.   var publicKey = "10001";
  33.  
  34.   // message holds data to encrypt, length must be 
  35.   // maxi (key length in bits / 8 - 3)
  36.  
  37.   // convert the "string" into a "byte array"
  38.   var array = new Array();
  39.   for(var k=0; k<message.length; k++)
  40.     array.push(message.charCodeAt(k));
  41.  
  42.   array = rsa_encrypt(array, publicKey, modulus, 512);
  43.   alert("Crypted data (byte array): " + array + "(" + array.length + ")");
  44.  
  45.  
  46. */
  47.  
  48. //--
  49. // The function to encrypt data
  50. //--
  51. function rsa_encrypt(message, public_key_hex, modulus_hex, keylength) {
  52.     var public_key = biFromHex(public_key_hex);
  53.     var modulus = biFromHex(modulus_hex);
  54.     var padded = add_PKCS1_padding(message, keylength / 8);
  55.     var number = binary_to_number(padded);
  56.     var encrypted = pow_mod(number, public_key, modulus);
  57.     var result = number_to_binary(encrypted, keylength / 8);
  58.     
  59.     return result;
  60. }
  61.  
  62. // -------------------------------- Implementation details below
  63.  
  64. //--
  65. // Computes (in a clever way ;-)) pow(p,q) mod r
  66. //--
  67. function pow_mod(p, q, r)
  68. {
  69.     // Extract powers of 2 from $q
  70.     var factors = new Array();
  71.     var power_of_two = 0;
  72.  
  73.     var TWO = biFromNumber(2);
  74.     var div = biCopy(q);
  75.         
  76.     while(biCompare(div, bigZero) == 1) {
  77.         rem = biModulo(div, TWO);
  78.         div = biDivide(div, TWO);
  79.  
  80.         if(biCompare(rem,bigOne)==0)
  81.             factors.push(power_of_two);
  82.         power_of_two++;
  83.     }
  84.  
  85.     // Calculate partial results for each factor, using each partial result as a
  86.     // starting point for the next. This depends of the factors of two being
  87.     // generated in increasing order.
  88.     partial_results = new Array();
  89.     part_res = biCopy(p);
  90.     idx = 0;
  91.  
  92.     for(k=0; k<factors.length; k++) {
  93.         factor = factors[k];
  94.         while(idx < factor)
  95.         {
  96.             part_res = biPow(part_res, 2);
  97.             part_res = biModulo(part_res, r);
  98.             idx++;
  99.         }
  100.         
  101.         partial_results.push(part_res);
  102.     }
  103.     
  104.     // Calculate final result
  105.     result = bigOne;
  106.     for(k=0; k<partial_results.length; k++) {
  107.         part_res = partial_results[k];
  108.         result = biMultiply(result, part_res);
  109.         result = biModulo(result, r);
  110.     }
  111.     
  112.     return result;
  113. }
  114.  
  115. //--
  116. // Function to add padding to a decrypted string
  117. // We need to know if this is a private or a public key operation [4]
  118. //--
  119. function add_PKCS1_padding(data, blocksize)
  120. {
  121.     var pad_length = blocksize - 3 - data.length;
  122.  
  123.     var result = new Array();
  124.     result.push(0);
  125.     result.push(2); // block type
  126.     for(i = 0; i < pad_length; i++)
  127.         result.push( Math.round(Math.random()*255) );
  128.     result.push(0);
  129.     result = result.concat(data);
  130.     return result;
  131. }
  132.  
  133. function binary_to_number(data)
  134. {
  135.     base = biFromNumber(256);
  136.     result = biFromNumber(0);
  137.     radix = biFromNumber(1);
  138.     
  139.     for(i = data.length-1; i >= 0; i--) {
  140.         digit = biFromNumber(data[i]);
  141.         part_res = biMultiply(digit, radix);
  142.         result = biAdd(result, part_res);
  143.         radix = biMultiply(radix, base); 
  144.     }
  145.     
  146.     return result;
  147. }
  148.  
  149. function number_to_binary(number, blocksize) {
  150.  
  151.     var base = biFromNumber(256);
  152.     var result = new Array();
  153.     var div = biCopy(number);
  154.     var idx = blocksize-1;
  155.     
  156.     for(k=0; k<blocksize; k++)
  157.         result.push(0);
  158.     
  159.     while(biCompare(div, bigZero) > 0)
  160.     {
  161.         mod = biModulo(div, base);
  162.         div = biDivide(div, base);
  163.         
  164.         // /!\ mod is a big integer
  165.         result[idx--] = parseInt(biToString(mod, 10));
  166.     }
  167.     
  168.     return result;
  169. }
  170. /* EOF */